再ハッシュの必要性
検索および挿入の望ましい平均ケース性能を保証するためには、負荷係数()は厳密に上限値に制限されなければなりません。ここでは要素数であり、はテーブルの容量です。
もしが無制限に増加すると、衝突が指数的に増加し、平均時間計算量はに低下します。
| 条件 | 発生する操作 | 影響 |
|---|---|---|
| 標準的な挿入 | 最適な効率が維持されます。 | |
| リサイズ(再ハッシュ) | を回復させますが、一時的にのパフォーマンスを確保しますが、一時的なコストがかかります。 |
一般的な閾値():0.70~0.75。
リサイズのプロセス
リサイズには、現在テーブル内にあるすべてのアイテムについてハッシュインデックスを再計算する必要があり、このプロセスは再ハッシュに低下します。
- 新しい容量の決定:新しい容量を設定します。通常、現在の容量の2倍()とします。これにより、新しいは臨界閾値の半分になります。
- テーブルの作成:新しいハッシュテーブル配列(サイズに低下します。
- アイテムの反復処理:古いテーブル内のすべての既存の要素をループ処理します。
- 再ハッシュ:各キーについて、更新されたモジュラスを使って新しいインデックスを計算します:
- 挿入:アイテムを新しいテーブルのに低下します。
注:モジュラスが変更されるため、単純に配列をコピーすることは不可能です。すべてのアイテムを再挿入する必要があります。
アモアライズドコスト
なぜリサイズが
リサイズにはすべての要素を処理する必要があり、その操作自体はの時間を要します。これは、挿入の目標を一時的に違反します。
アモアライズド解析
このコストを正当化するためにアモアライズド解析を使用します。テーブルがリサイズごとにサイズを2倍にする(指数成長)場合、高価なコストは、間に続く多くの挿入に分散されます。
任意の1つの挿入の平均コストは、定期的な任意の挿入を考慮に入れてもリサイズを含めてもに低下します。
📝 インタラクティブクイズ
1. ハッシュマップの容量がで最大負荷係数がであるとき、何個の要素()を超える時点でリサイズがトリガーされるべきですか?
2. リサイズ中に、古いテーブルの要素をそのまま新しい大きなテーブルにコピーできない理由は何ですか?
3. リサイズ時にサイズを2倍にするハッシュテーブルにおける挿入のアモアライズド時間計算量はどれですか?
4. 負荷係数が高くなりすぎたときにハッシュテーブルのリサイズを行わない場合の主な結果は何ですか?